package cn.ruanyun.backInterface.modules.base.controller.manage;


import cn.ruanyun.backInterface.common.utils.PageUtil;
import cn.ruanyun.backInterface.common.utils.ResultUtil;
import cn.ruanyun.backInterface.common.vo.PageVo;
import cn.ruanyun.backInterface.common.vo.Result;
import cn.ruanyun.backInterface.modules.base.dto.StoreListDto;
import cn.ruanyun.backInterface.modules.base.dto.UserDTO;
import cn.ruanyun.backInterface.modules.base.dto.UserUpdateDTO;
import cn.ruanyun.backInterface.modules.base.dto.WechatLoginDto;
import cn.ruanyun.backInterface.modules.base.pojo.CallForm;
import cn.ruanyun.backInterface.modules.base.pojo.DataVo;
import cn.ruanyun.backInterface.modules.base.service.mybatis.IUserService;
import cn.ruanyun.backInterface.modules.base.vo.*;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Maps;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.Map;
import java.util.Optional;


/**
 * app端的用户部分
 */
@Slf4j
@RestController
@RequestMapping("/ruanyun/appUser")
@Transactional
@Api(tags = "app用户管理接口")
public class AppUserController {


    @Autowired
    private IUserService userService;


    /**
     * APP通过邀请码获取用户信息
     * @param user user
     * @return Object
     */
    @PostMapping("/appGetinvitationCode")
    public Result<Object> appGetinvitationCode(UserDTO user) {

        return userService.appGetinvitationCode(user);
    }


    /**
     * 通过手机号注册
     * @param user user
     * @return Object
     */
    @PostMapping("/registerByPhoneAndPassword")
    @ApiOperation("通过手机号密码注册")
    public Result<Object> registerByPhoneAndPassword(UserDTO user) {

        return userService.registerByPhoneAndPassword(user);
    }

    /**
     * 通过手机号注册 （新）
     * @param user user
     * @return Object
     */
    @PostMapping("/registerByPhoneAndPasswordNew")
    @ApiOperation("通过手机号密码注册")
    public Result<Object> registerByPhoneAndPasswordNew(UserDTO user) {

        return userService.registerByPhoneAndPasswordNew(user);
    }

    /**
     * 通过手机号和密码登录（新）
     * @param user user
     * @return Object
     */
    @PostMapping("/loginByPhoneAndPasswordNew")
    @ApiOperation(value = "通过手机号和密码登录")
    public Result<Object> loginByPhoneAndPasswordNew(UserDTO user) {

        return userService.loginByPhoneAndPasswordNew(user);
    }



    /**
     * 通过手机号和密码登录
     * @param user user
     * @return Object
     */
    @PostMapping("/loginByPhoneAndPassword")
    @ApiOperation(value = "通过手机号和密码登录")
    public Result<Object> loginByPhoneAndPassword(UserDTO user) {

        return userService.loginByPhoneAndPassword(user);
    }

    /**
     * PC端 登录账号、手机号登录
     * @param user user
     * @return Object
     */
    @PostMapping("/pcLogin")
    @ApiOperation(value = "通过手机号和密码登录")
    public Result<Object> pcLogin(UserDTO user) {

        return userService.pcLogin(user);
    }


    /**
     * 获取个人信息
     * @return Object
     */
    @GetMapping("/getAppUserInfo")
    public Result<Object> getAppUserInfo() {

        return new ResultUtil<>().setData(userService.getAppUserInfo(), "获取个人信息成功！");

    }

    /**
     * 更新个人信息
     * @return
     */
    @PostMapping("/updateAppUserInfo")
    public Result<Object> updateAppUserInfo(UserUpdateDTO userUpdateDTO){

        return userService.updateAppUserInfo(userUpdateDTO);
    }

    /**
     * 忘记密码
     */
    @PostMapping("/forgetPassword")
    public Result<Object> forgetPassword(UserDTO user){

        return userService.forgetPassword(user);
    }

    /**
     * 获取账户余额
     */
    @PostMapping("/getAccountBalance")
    public Result<Object> getAccountBalance(String userId){

        return new ResultUtil<>().setData(userService.getAccountBalance(userId), "获取账户余额成功！");

    }


    /**
     * 设置-忘记支付密码
     * @param userPayPasswordVo 实体
     * @return Object
     */
    @PostMapping("/setPayPassword")
    public Result<Object> setPayPassword(UserPayPasswordVo userPayPasswordVo) {

        return userService.setPayPassword(userPayPasswordVo);
    }


    /**
     * 更新支付密码
     * @param userPayPasswordVo  userPayPasswordVo
     * @return Object
     */
    @PostMapping("/updatePayPassword")
    public Result<Object> updatePayPassword(UserPayPasswordVo userPayPasswordVo) {

        return userService.updatePayPassword(userPayPasswordVo);
    }


    /**
     * 获取龙虎排行榜
     * @param pageVo
     * @return
     */
    @PostMapping("/getUserProfitList")
    public Result<Object> getUserProfitList(PageVo pageVo) {

        return Optional.ofNullable(userService.getUserProfitList())
                .map(userProfitVos -> {

                    DataVo<UserProfitVO> result = new DataVo<>();
                    result.setTotalNumber(userProfitVos.size())
                            .setDataResult(PageUtil.listToPage(pageVo, userProfitVos));

                    return new ResultUtil<>().setData(result, "获取龙湖排行榜成功！");
                }).orElse(new ResultUtil<>().setErrorMsg(201, "暂无数据！"));

    }


    /**
     * 获取精准客户
     * @param pageVo 分页参数
     * @return Object
     */
    @PostMapping("/getStoreAccurateCustomer")
    public Result<Object> getStoreAccurateCustomer(PageVo pageVo) {

        return Optional.ofNullable(userService.getStoreAccurateCustomer(null))
                .map(storeCustomVos -> {

                    DataVo<UserProfitVO> result = new DataVo<>();
                    result.setTotalNumber(storeCustomVos.size())
                            .setDataResult(PageUtil.listToPage(pageVo, storeCustomVos));

                    return new ResultUtil<>().setData(result, "获取精准客户数据成功！");
                }).orElse(new ResultUtil<>().setErrorMsg(201, "暂无数据！"));

    }


    /**
     * 获取潜在客户
     * @param pageVo 分页参数
     * @return Object
     */
    @PostMapping("/getStoreProspectiveCustomer")
    public Result<Object> getStoreProspectiveCustomer(PageVo pageVo) {

        return Optional.ofNullable(userService.getStoreProspectiveCustomer())
                .map(storeCustomVos -> {

                    DataVo<UserProfitVO> result = new DataVo<>();
                    result.setTotalNumber(storeCustomVos.size())
                            .setDataResult(PageUtil.listToPage(pageVo, storeCustomVos));

                    return new ResultUtil<>().setData(result, "获取潜在客户数据成功！");
                }).orElse(new ResultUtil<>().setErrorMsg(201, "暂无数据！"));

    }


    /**
     * 微信授权登录
     * @param wechatLoginDto 参数
     * @return Object
     */
    @PostMapping("/wechatLogin")
    public Result<Object> wechatLogin(WechatLoginDto wechatLoginDto) {

        return userService.wechatLogin(wechatLoginDto);
    }

    /**
     * 绑定手机号
     * @param wechatLoginDto 参数
     * @return Object
     */
    @PostMapping("/bindMobile")
    public Result<Object> bindMobile(WechatLoginDto wechatLoginDto) {

        return userService.bindMobile(wechatLoginDto);
    }


    @PostMapping("/getUserBalance")
    @ApiOperation(value = "获取用户余额明细")
    public Result<UserBalanceVo> getUserBalance() {

        return new ResultUtil<UserBalanceVo>().setData(userService.getUserBalance(), "获取用户余额明细成功！");
    }


    @PostMapping("/storeListDto")
    @ApiOperation("获取商家列表")
    public Result<DataVo<StoreListVo>> getStoreList(PageVo pageVo,StoreListDto storeListDto) {

        return userService.getStoreList(pageVo,storeListDto);
    }

    @PostMapping("/getBackUserWorkList")
    @ApiOperation("获取个人工作室列表")
    public Result<Object> getBackUserWorkList(PageVo pageVo, UserDTO userDTO) {

        return Optional.ofNullable(userService.getBackUserWorkList(userDTO)).map(userVOS -> {

            Map<String, Object> result = Maps.newHashMap();
            result.put("data", userVOS);
            result.put("size", userVOS.size());

            return new ResultUtil<>().setData(result, "获取个人工作室成功！");
        }).orElse(new ResultUtil<>().setErrorMsg(201, "暂无数据！"));

    }


    @GetMapping("/getPrivateContent")
    public String getPrivateContent() {

        return "为保障用户个人信息权利，根据《中华人民共和国民法总则》《中华人民共和国网络安全法》和《中华人民共和国电子商务法》等法律法规，婚前婚后特制定本规则。\n" +
                "本规则作为《婚前婚后用户使用协议》和《婚前婚后商家注册协议》的附件，与两协议具有同等法律效力。\n" +
                "1、本规则的名词解释\n" +
                "1.1 “婚前婚后”，是指婚前婚后电子商务平台服务的提供者合肥翰飞科技有限公司。\n" +
                "1.2 “婚前婚后用户”，是指在婚前婚后平台注册接受婚前婚后服务的自然人（消费者）；\n" +
                "1.3 “婚前婚后商家”，是指在婚前婚后平台注册从事婚礼服务或者婚品等商品销售的经营者。\n" +
                "1.4 “用户信息”，是指婚前婚后用户或者婚前婚后商家的自然人信息，即以电子或者其他方式记录的能够单独或者与其他信息结合识别自然人个人身份的各种信息，包括但不限于自然人的姓名、出生日期、身份证件号码、个人生物识别信息、住址、电话号码等。\n" +
                "1.5 “您”，是指婚前婚后用户或者婚前婚后商家。\n" +
                "2、用户信息的收集和使用\n" +
                "2.1 您已知悉且同意，在您注册婚前婚后帐号或使用婚前婚后提供的服务时，婚前婚后将记录您提供的相关个人信息，如：姓名、手机号码等，上述个人信息是您获得婚前婚后提供服务的基础。同时，基于优化用户体验之目的，婚前婚后会获取与提升婚前婚后服务有关的其他信息，例如当您访问婚前婚后时，我们可能会收集哪些服务的受欢迎程度、浏览器软件信息等以便优化我们的服务。\n" +
                "2.2 婚前婚后为向您提供服务所收集的用户信息，包括：\n" +
                "2.2.1 您的注册账号、名号、头像以及与之关联的手机号等用户信息；\n" +
                "2.2.2 您的日志信息。当您使用我们提供的产品\\服务时，我们会自动收集您使用我们服务的详细情况，并作为有关的网络日志保存，包括但不限于您的IP地址、浏览器的类型、使用的语言、操作系统的版本、访问的日期和时间、及您请求的网页记录等信息。\n" +
                "2.2.3 您的设备信息。我们可能会根据您在软件安装及使用中的具体权限，接收并记录您在接受我们服务过程中使用的相关设备信息，例如设备型号、唯一设备标识符、操作系统、分辨率、电信运营商等软硬件信息等。\n" +
                "2.2.4 其他用于为您服务需要收集的信息（具体收集时将予以告知）。\n" +
                "2.3 为了便捷您发现周边的餐饮、酒店、景点、商场、银行等生活服务信息，婚前婚后系统将会基于您的地理位置为您提供服务（LBS）。当您开启设备定位功能并使用婚前婚后的LBS时，婚前婚后系统可能会自动收集和使用您的位置信息，以实现婚前婚后为您提供本地周边生活服务的目的（如您不需要手动输入自身地理位置就可获得相关服务，以及估算商家与您之间的实际距离方便您进行消费决策等）。婚前婚后系统对您的实际位置进行定位，包括 IP 地址、GPS 以及能够提供相关信息的Wi-Fi 接入点、蓝牙和基站等传感器技术。婚前婚后特别声明，此类定位信息收集使用，完全是系统条件操作，婚前婚后已采取严格的技术手段措施，杜绝可能用于为您提供前述服务以外的其他不当用途。\n" +
                "2.4 您同意，婚前婚后为向您提供服务可以使用您2.2的用户信息，包括提供给为您服务并愿意承担与婚前婚后一样的保护责任的婚前婚后关联方。\n" +
                "3、用户信息的管理\n" +
                "3.1 为了向您提供更好的服务或产品，婚前婚后会在下述情形使用您的用户信息：\n" +
                "3.1.1 根据相关法律法规的要求；\n" +
                "3.1.2 根据您的授权；\n" +
                "3.1.3 根据婚前婚后相关服务条款、应用许可使用协议的约定。\n" +
                "3.2 您已知悉并同意：在现行法律法规允许的范围内，婚前婚后可能会将您的用户信息用于市场营销，使用方式包括但不限于：在婚前婚后平台中向您展示或提供广告和促销资料，向您通告或推荐婚前婚后的服务或产品信息，以及其他此类根据您使用婚前婚后服务或产品的情况所认为您可能会感兴趣的信息。其中也包括您在采取授权等某动作时选择分享的信息，例如当您新增朋友、在动态中新增地标、使用婚前婚后的联络人汇入工具等。\n" +
                "3.3 未经您本人允许，婚前婚后不会向任何第三方披露您的用户信息，但下列情形除外：\n" +
                "3.3.1 婚前婚后已经取得您或您监护人的授权；\n" +
                "3.3.2 司法机关或行政机关给予法定程序要求婚前婚后披露的；\n" +
                "3.3.3 婚前婚后为维护自身合法权益而向用户提起诉讼或仲裁时；\n" +
                "3.3.4 根据您与婚前婚后相关服务条款、应用许可使用协议的约定；\n" +
                "3.3.5 法律法规规定的其他情形。\n" +
                "4、用户信息保护措施\n" +
                "4.1 婚前婚后谨遵法律规定，承担对您个人信息的保护义务，采取必要措施不会泄露、篡改、毁损您的个人信息；除依照法律规定和双方约定外，未经您的同意，婚前婚后不会将您的个人信息透露给任何第三人。\n" +
                "4.2 为防止用户信息在意外的、未经授权的情况下被非法访问、复制、修改、传送、遗失、破坏、处理或使用，婚前婚后采取的措施包括：\n" +
                "4.2.1 以适当的方式对用户的个人信息进行加密处理；\n" +
                "4.2.2 在适当的位置使用密码对用户个人信息进行保护\n" +
                "4.2.3 限制对用户个人信息的访问；\n" +
                "4.2.4 其他必要的合理措施。\n" +
                "4.3 用户信息的保护，不仅婚前婚后应当采取必要措施，履行法律义务，用户自己也要承担相应责任，包括并不限于采取诸如定期修改帐号密码、加大密码设置的安全性，不将自己的帐号密码等用户信息透露给他人等安全措施。\n" +
                "4.4 您知悉：婚前婚后提供的用户信息保护措施仅适用于婚前婚后平台，一旦您离开婚前婚后，浏览或使用其他网站、服务及内容资源，婚前婚后即没有能力及义务保护您在婚前婚后以外的网站提交的任何用户信息，无论您登陆或浏览上述网站是否基于婚前婚后的链接或引导。\n" +
                "5、用户信息的查询和更正、删除\n" +
                "5.1 当您完成婚前婚后的帐号注册后，您可以查阅或修改您提交给婚前婚后的用户信息。一般情况下，您可随时浏览、修改自己提交的信息，但出于安全性和身份识别（如号码申诉服务）的考虑，您可能无法修改注册时提供的某些初始注册信息及验证信息。\n" +
                "5.2 用户或者商家需要查询您可能无法修改注册时提供的某些初始注册信息及验证信息的，可以向相关婚前婚后客服申请。婚前婚后客服受理后将在2日内给您答复，并向符合条件的申请人提供查询信息。\n" +
                "5.3 经查询，您发现您的用户信息错误的，您有权向婚前婚后提出更正要求；您发现婚前婚后收集的您用户信息超出约定范围或者其他不符合法律规定收集的，您亦有权要求婚前婚后予以删除。您提出的理由成立的，婚前婚后将予以更正或者删除。\n" +
                "5.4 对Cookie及web beacon的使用\n" +
                "5.4.1 Cookie可以帮助网站辨认注册用户，计算用户数量，通常被各网站用来判定完成注册的用户是否已经实现登录。婚前婚后承诺，对cookie信息的研究仅用于提升服务/产品质量及优化用户体验之目的。同时，您如不希望用户信息保留在cookie中，您可以对浏览器进行配置：选择“拒绝cookie”或“当网站发送cookie时通知您”，您知道，鉴于婚前婚后的服务是通过支持cookie来是实现的，完成关闭cookie的操作后，可能影响到您访问婚前婚后或不能充分取得婚前婚后的服务。您不禁用cookie时，可能会得到提示：是否在下一次进入此网站时保留用户信息以便简化登录手续（如一键登录）。\n" +
                "5.4.2 婚前婚后使用web beacon的方法和目的与cookie是相同的。\n" +
                "6、未成年人的用户注册\n" +
                "6.1 婚前婚后电子商务平台主要面向成年人，申请注册为婚前婚后用户或者婚前婚后商家的，原则上应当是成年人（含十六周岁以上，以自己的劳动收入为主要生活来源的自然人）。\n" +
                "6.2 若您是18周岁以下的未成年人，在使用婚前婚后的服务前，应确保事先取得监护人的同意，如您在婚前婚后上申请注册账号，婚前婚后将默认为您已得到前述同意。\n" +
                "6.3 对未成年人的用户信息，婚前婚后将依照法律规定，予以严格保护。";
    }

    @PostMapping(value ="/phoneCallback")
    @ApiOperation("AXB模式呼叫事件通知接口（华为云推送）")
    public void axbCallEventInform(@RequestBody CallForm callForm)  {

        userService.phoneCallback(callForm);
    }

    @PostMapping("/getPlatformCount")
    @ApiOperation("获取平台统计")
    public Result<PlatformCount> getPlatformCount() {

        return new ResultUtil<PlatformCount>().setData(userService.getPlatformCount(), "获取平台统计数据成功！");
    }

}
